//============================================================================
// Name        : verketteteListen.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

struct Elemente
{
	char	wert;
	Elemente *next;
	Elemente *prev;
};

Elemente *heap=0;
Elemente *end=0;

int istListeLeer()
{
	if (heap==0)
	{
		return 1;
	}
	return 0;
}


void schreibeListe(){
	Elemente *p=heap;
	if(istListeLeer())
	{
		cout << "Die Liste ist leer" << endl;
	}else
	{
	while(p)
		{

			cout << p->wert <<endl;
			p=p->next;
		}

	}
}


void neuesElementEnde(char wert)
{
	Elemente *neuesEnde= new Elemente;
	neuesEnde->wert=wert;
	neuesEnde->next=0;
	neuesEnde->prev=0;
	if(istListeLeer())
	{
		heap=neuesEnde;
		end=neuesEnde;
	}else
		{
		end->next=neuesEnde;
		neuesEnde->prev=end;
		end=neuesEnde;
		}
}

void neuesElementAnfang(char wert)
{
	Elemente *neuesAnfang = new Elemente;
	neuesAnfang->wert=wert;
	neuesAnfang->next=0;
	neuesAnfang->prev=0;

	if (istListeLeer())
	{
		heap = neuesAnfang;
		end = neuesAnfang;
	}else
	{
		neuesAnfang->next=heap;
		heap->prev = neuesAnfang;
		heap=neuesAnfang;
	}

}

void loescheListe(){
	Elemente *p=heap, *temp=0;
	if (istListeLeer())
	{
		cout << "Lieste ist nicht vorhanden" << endl;
	}else
	{
		while(p)
		{
		temp=p->next;
		delete p;
		p=temp;
		}
		heap=0;
	}

}

void schreibeListeRueck()
{
	Elemente *p=end;
		if(istListeLeer())
		{
			cout << "Die Liste ist leer" << endl;
		}else
		{
		while(p)
			{

				cout << p->wert <<endl;
				p=p->prev;
			}

		}
}

int istPalindrom()
{
	Elemente *anfang=heap;
	Elemente *ende=end;
	int i=0, j=0;
	char a=0, b=0;
	if(istListeLeer())
	{
		cout<< "Liste ist leer"<<endl;
		return 0;
	}else
	{
		do
		{
		a=anfang->wert;
		b=ende->wert;
		if (a==b)
		{
			i++;
		}else
		{
			j++;
		}
		anfang=anfang->next;
		ende=ende->prev;
		}while (anfang!=0);
	}
	if (j)
	{
		return 0;
	}
	return 1;
}

int main() {
	int auswahl=1;
	char wert=0;


	while(auswahl){
	cout << "Neues Element am Angang? Drücke 1" <<endl;
	cout << "Neues Element am Ende?   Drücke 2" <<endl;
	cout << "Liste ausgeben? Drücke 3" << endl;
	cout << "Lieste löschen mit 4" << endl;
	cout << "Liste Rückwärts ausgeben mit 5" << endl;
	cout << "Ist Palindrom? Drücke 6" << endl;
	cout << "Ende und löschen der Liste mit 0" << endl;
	cin >> auswahl;
	switch(auswahl)
	{
	case 1:
	{
		cout << "Bitte Wert für Element am Anfang"<< endl;
		cin >> wert;
		neuesElementAnfang(wert);
		break;
	}
	case 2:
	{
		cout << "Bitte Wert für Element am Ende" << endl;
		cin >> wert;
		neuesElementEnde(wert);
		break;
	}
	case 3:
	{
		schreibeListe();
		break;
	}
	case 4:
	{
		loescheListe();
		cout << "Die Lieste wurde gelöscht" << endl;
		break;
	}
	case 0:
	{
		cout << "CYA!" <<endl;
		loescheListe();
		schreibeListe();
		return 0;
	}
	case 5:
	{
		schreibeListeRueck();
		break;
	}
	case 6:
	{
		if(istPalindrom())
		{
			cout << "Ja" <<endl;
		}else
		{
			cout << "NEIN" << endl;
		}
		break;
	}
	default:
		cout<<"Falsche Eingabe" << endl;

	}

	}
	return 0;
}



